home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 18 / CU Amiga Magazine's Super CD-ROM 18 (1997)(EMAP Images)(GB)[!][issue 1998-01].iso / CUCD / Graphics / DrawStudio / Table.dsrx < prev    next >
Text File  |  1997-09-12  |  13KB  |  486 lines

  1. /* Allow commands to return results */
  2.  
  3. options results
  4.  
  5. /* On error, goto ERROR:. Comment out this line if you wish to */
  6. /* perform your own error checking. */
  7.  
  8. signal on error
  9.  
  10. 'PROJECT_LOCK'
  11.  
  12. /* BEGIN PROGRAM *************************************************/
  13.  
  14. /* +++++++++++++++++++++++++++ */
  15. /* +                         + */
  16. /* + Table ARexx script V1.0 + */
  17. /* +                         + */
  18. /* + Written by Andrew Elia  + */
  19. /* +                         + */
  20. /* +++++++++++++++++++++++++++ */
  21.  
  22. PTCNV = 28.346                /* *CONSTANT!* Converts points to Centimetres */
  23.  
  24. DATAFILE = "Dh0:T/DSMiscRexxVol3/TableDataFile"    /* Full path of data file */
  25.  
  26. CELLLEFTMARGIN = 0.25            /* Sets left margin inside cell   */
  27. CELLRIGHTMARGIN = 0.25            /* Sets right margin inside cell  */
  28. CELLTOPMARGIN = 0.25            /* Sets top margin inside cell    */
  29. CELLBOTTOMMARGIN = 0.25            /* Sets bottom margin inside cell */
  30.  
  31. EVENWIDTH = 0                    /* Ensures that all cells are the same width */
  32. EVENHEIGHT = 1                    /* Ensures that all cells are the same height */
  33. CENTRETALLEST = 1                /* Sets vertical alignment method (0 for individual centre, 1 for tallest in row, 2 for tallest in table) */
  34. SHOWMARGINS = 1                    /* Set to 1 to show margins, 0 to hide them */
  35.  
  36. XOFFSET=2                        /* Sets the offset between the left of the table and the page*/
  37. YOFFSET=2                        /* Sets the offset between the top of the table and the page */
  38. UNIT="cm"                        /* Sets the default unit */
  39.  
  40. /* Open data file */
  41.  
  42. OK = Open('File',DATAFILE,'r')
  43. If OK = 0 Then Do
  44.     REQ_MESSAGE TEXT '"Error: Unable to open data file"' '"Cancel"'
  45.     PROJECT_UNLOCK
  46.     Exit
  47. End
  48.  
  49. /* Read in data */
  50.  
  51. LINES = 0
  52. FINISHED = 0
  53.  
  54. do while ((~eof('File')) & (FINISHED = 0))
  55.        INPUT = readln('File')
  56.  
  57.     IF INPUT = "" Then Do
  58.         FINISHED = 1
  59.     End
  60.     Else Do
  61.         FILEDATA.LINES = INPUT
  62.         LINES = LINES + 1
  63.     End
  64. End
  65.  
  66. Call Close('File')
  67.  
  68. CELLSX = 0
  69. CELLSY = LINES
  70.  
  71. /* This bit works out the number of columns from the amount of data */
  72. /* in the file */
  73.  
  74. Do N = 0 To LINES - 1
  75.     TEMPSTR = Compress(FILEDATA.N, ',')
  76.     NUMDAT = Length(FILEDATA.N) - Length(TEMPSTR)
  77.     If NUMDAT > CELLSX Then Do
  78.         CELLSX = NUMDAT
  79.     End
  80. End
  81.  
  82. CELLSX = CELLSX + 1
  83.  
  84. /* This bit sifts through the data to extract any control codes */
  85. /* and also sorts the data into a more convenient format        */
  86.  
  87. Do N = 0 To LINES - 1
  88.     TEMPSTR = Compress(FILEDATA.N, ',')
  89.     NUMDAT = Length(FILEDATA.N) - Length(TEMPSTR)
  90.     START = 1
  91.     Do M = 0 To NUMDAT-1
  92.         POS = Index(FILEDATA.N, ',', START)
  93.         DATA.N.M = Substr(FILEDATA.N, START, POS - START)
  94.         If Length(DATA.N.M) > 2 Then Do
  95.             JUST.N.M = Substr(DATA.N.M, 1, 2)
  96.             DATA.N.M = Substr(DATA.N.M, 3, Length(DATA.N.M) - 2)
  97.         End
  98.         START = POS + 1
  99.     End
  100.     DATA.N.NUMDAT = Substr(FILEDATA.N, START, Length(FILEDATA.N) - START + 1)
  101.     If Length(DATA.N.NUMDAT) > 2 Then Do
  102.         JUST.N.NUMDAT = Upper(Substr(DATA.N.NUMDAT, 1, 2))
  103.         DATA.N.NUMDAT = Substr(DATA.N.NUMDAT, 3, Length(DATA.N.NUMDAT) - 2)
  104.     End
  105. End
  106.  
  107. /* I added this bit as a safety measure. If the horizontal or vertical */
  108. /* justify codes are either absent or wrongly specified (they are case */
  109. /* insensitive, by the way), this part will display a requester asking */
  110. /* whether or not the operation should proceed or not despite the      */
  111. /* problem. In the long run, it saves a great deal of hair loss! It    */
  112. /* should be noted that the following is programmed so that you can    */
  113. /* leave some cells totally blank without it complaining. */
  114.  
  115. JUMPNOW = 0
  116.  
  117. Do X = 0 To CELLSX-1
  118.     Do Y = 0 To CELLSY-1
  119.         HOK = 0
  120.         VOK = 0
  121.         If Left(JUST.Y.X, 1) = "L" Then Do
  122.             HOK = 1
  123.         End
  124.         If Left(JUST.Y.X, 1) = "C" Then Do
  125.             HOK = 1
  126.         End
  127.         If Left(JUST.Y.X, 1) = "R" Then Do
  128.             HOK = 1
  129.         End
  130.  
  131.         If Right(JUST.Y.X, 1) = "T" Then Do
  132.             VOK = 1
  133.         End
  134.         If Right(JUST.Y.X, 1) = "M" Then Do
  135.             VOK = 1
  136.         End
  137.         If Right(JUST.Y.X, 1) = "B" Then Do
  138.             VOK = 1
  139.         End
  140.  
  141.         If DATA.Y.X = "" Then Do
  142.             HOK = 1
  143.             VOK = 1
  144.         End
  145.  
  146.         If (HOK = 0) | (VOK = 0) Then Do
  147.             REQ_MESSAGE TEXT '"Error: The data file contains invalid control codes.*nThis may cause the table to be drawn incorrectly."' '"Proceed|Cancel"'
  148.             If Result = 1 Then Do
  149.                 JUMPNOW = 1
  150.                 Leave
  151.             End
  152.             Else Do
  153.                 PROJECT_UNLOCK
  154.                 Exit
  155.             End
  156.         End
  157.     End
  158.  
  159.     If JUMPNOW = 1 Then Do
  160.         Leave
  161.     End
  162. End
  163.  
  164. REDRAW_OFF
  165.  
  166. BIGWIDEST = 0
  167.  
  168. /* Here we do several things: First we look for any instances of "\n" in   */
  169. /* the data, and convert them into carriage returns. We also look for the  */
  170. /* widest text (and therefore cells) in the table and in each column. This */
  171. /* will be of use when we are applying even cell widths. Finally, we       */
  172. /* quietly print out all of the text from the table and make a note of the */
  173. /* name DrawStudio has given them for future reference */
  174.  
  175. Do X = 0 To CELLSX-1
  176.     WIDEST.X = 0
  177.     Do Y = 0 To CELLSY-1
  178.         TRYSL = 0
  179.         Do While TRYSL = 0
  180.             SLPOS = Index(DATA.Y.X, '\n')
  181.             If SLPOS = 0 Then Do
  182.                 TRYSL = 1
  183.             End
  184.             Else Do
  185.                 DATA.Y.X = Left(DATA.Y.X, SLPOS - 1)||'0D'x||Right(DATA.Y.X, Length(DATA.Y.X) - SLPOS - 1)
  186.             End
  187.         End
  188.  
  189.         MYJUST = "Left"
  190.         If Left(JUST.Y.X, 1) = "L" Then Do
  191.             MYJUST = "Left"
  192.         End
  193.         If Left(JUST.Y.X, 1) = "C" Then Do
  194.             MYJUST = "Centre"
  195.         End
  196.         If Left(JUST.Y.X, 1) = "R" Then Do
  197.             MYJUST = "Right"
  198.         End
  199.  
  200.         'CREATE_TEXT '||XOFFSET||UNIT||' '||YOFFSET||UNIT||' "'||DATA.Y.X||'"'
  201.         TEXT.Y.X = Result
  202.         'ATTRS_TEXT_SET FONT "Times-Roman" SIZE "12" ALIGN "'||MYJUST||'"'
  203.         OBJECT_SPECS_GET STEM 'OBJSPECS.'
  204.         MYWIDTH = OBJSPECS.WIDTH / PTCNV
  205.         If MYWIDTH > WIDEST.X Then Do
  206.             WIDEST.X = MYWIDTH
  207.         End
  208.     End
  209.     If WIDEST.X > BIGWIDEST Then Do
  210.         BIGWIDEST = WIDEST.X
  211.     End
  212. End
  213.  
  214. BIGTALLEST = 0
  215.  
  216. /* Below, we find the tallest cells in each row as well as in the entire */
  217. /* table. */
  218.  
  219. Do Y = 0 To CELLSY-1
  220.     TALLEST.Y = 0
  221.     Do X = 0 To CELLSX-1
  222.         OBJECT_DESELECT
  223.         OBJECT_SELECT TEXT.Y.X
  224.         OBJECT_SPECS_GET STEM 'OBJSPECS.'
  225.         MYHEIGHT = OBJSPECS.HEIGHT / PTCNV
  226.         If MYHEIGHT > TALLEST.Y Then Do
  227.             TALLEST.Y = MYHEIGHT
  228.         End
  229.     End
  230.     If TALLEST.Y > BIGTALLEST Then Do
  231.         BIGTALLEST = TALLEST.Y
  232.     End
  233. End
  234.  
  235. /* From the above calculations, we can now work out the exact dimensions */
  236. /* of the entire table. We'll need this for ruling the table's lines */
  237.  
  238. If EVENWIDTH = 1 Then Do
  239.     TABLEWIDTH = (CELLLEFTMARGIN + CELLRIGHTMARGIN + BIGWIDEST) * CELLSX
  240. End
  241. Else Do
  242.     TABLEWIDTH = 0
  243.     Do X = 0 To CELLSX-1
  244.         TABLEWIDTH = TABLEWIDTH + CELLLEFTMARGIN + CELLRIGHTMARGIN + WIDEST.X
  245.     End
  246. End
  247.  
  248. If EVENHEIGHT = 1 Then Do
  249.     TABLEHEIGHT = (CELLTOPMARGIN + CELLBOTTOMMARGIN + BIGTALLEST) * CELLSY
  250. End
  251. Else Do
  252.     TABLEHEIGHT = 0
  253.     Do Y = 0 To CELLSY-1
  254.         TABLEHEIGHT = TABLEHEIGHT + CELLTOPMARGIN + CELLBOTTOMMARGIN + TALLEST.Y
  255.     End
  256. End
  257.  
  258. LINESGROUPNUM = 0
  259. MARGINLINESGROUPNUM = 0
  260.  
  261. /* Now for the graph bit: For the horizontal section, we simply rule a line */
  262. /* downwards, and start aligning all the table text horizontally. Much of   */
  263. /* this will depend upon what control codes have been set in the data file. */
  264.  
  265. X1 = XOFFSET
  266. Y1 = YOFFSET
  267. Y2 = Y1 + TABLEHEIGHT
  268. Do X = 0 To CELLSX-1
  269.     CREATE_LINE X1||UNIT||" "||Y1||UNIT||" "||X1||UNIT||" "||Y2||UNIT
  270.     LINESGROUPNAME.LINESGROUPNUM = Result
  271.     LINESGROUPNUM = LINESGROUPNUM + 1
  272.  
  273.     If EVENWIDTH = 1 Then Do
  274.         MYWIDTH = BIGWIDEST
  275.     End
  276.     Else Do
  277.         MYWIDTH = WIDEST.X
  278.     End
  279.  
  280.     RX1 = X1 + CELLLEFTMARGIN
  281.     RX2 = RX1 + MYWIDTH
  282.     If SHOWMARGINS = 1 Then Do
  283.         CREATE_LINE RX1||UNIT||" "||Y1||UNIT||" "||RX1||UNIT||" "||Y2||UNIT
  284.         MARGINLINESGROUPNAME.MARGINLINESGROUPNUM = Result
  285.         MARGINLINESGROUPNUM = MARGINLINESGROUPNUM + 1
  286.         CREATE_LINE RX2||UNIT||" "||Y1||UNIT||" "||RX2||UNIT||" "||Y2||UNIT
  287.         MARGINLINESGROUPNAME.MARGINLINESGROUPNUM = Result
  288.         MARGINLINESGROUPNUM = MARGINLINESGROUPNUM + 1
  289.     End
  290.     Do Y = 0 To CELLSY-1
  291.         OBJECT_DESELECT
  292.         OBJECT_SELECT TEXT.Y.X
  293.         If Left(JUST.Y.X, 1) = "L" Then Do
  294.             OBJECT_SPECS_GET STEM 'OBJSPECS.'
  295.             TX = OBJSPECS.LEFT / PTCNV
  296.             "OBJECT_MOVE X "||(RX1-TX)||UNIT
  297.         End
  298.         If Left(JUST.Y.X, 1) = "C" Then Do
  299.             OBJECT_SPECS_GET STEM 'OBJSPECS.'
  300.             TX = OBJSPECS.LEFT / PTCNV
  301.             WX = OBJSPECS.WIDTH / PTCNV
  302.             "OBJECT_MOVE X "||((RX1-TX) + ((MYWIDTH-WX)/2))||UNIT
  303.         End
  304.         If Left(JUST.Y.X, 1) = "R" Then Do
  305.             OBJECT_SPECS_GET STEM 'OBJSPECS.'
  306.             TX = OBJSPECS.LEFT / PTCNV
  307.             WX = OBJSPECS.WIDTH / PTCNV
  308.             "OBJECT_MOVE X "||((RX1-TX) + (MYWIDTH-WX))||UNIT
  309.         End
  310.     End
  311.  
  312.     X1 = X1 + CELLLEFTMARGIN + CELLRIGHTMARGIN + MYWIDTH
  313. End
  314. CREATE_LINE X1||UNIT||" "||Y1||UNIT||" "||X1||UNIT||" "||Y2||UNIT
  315. LINESGROUPNAME.LINESGROUPNUM = Result
  316. LINESGROUPNUM = LINESGROUPNUM + 1
  317.  
  318. /* For the vertical section, we now rule a line across, and start aligning  */
  319. /* (or at least trying to) all the table text vertically. Much of this will */
  320. /* depend upon what control codes have been set in the data file, together  */
  321. /* with the value of the CENTRETALLEST variable. */
  322.  
  323. X1 = XOFFSET
  324. Y1 = YOFFSET
  325. X2 = X1 + TABLEWIDTH
  326. Do Y = 0 To CELLSY-1
  327.     CREATE_LINE X1||UNIT||" "||Y1||UNIT||" "||X2||UNIT||" "||Y1||UNIT
  328.     LINESGROUPNAME.LINESGROUPNUM = Result
  329.     LINESGROUPNUM = LINESGROUPNUM + 1
  330.  
  331.     If EVENHEIGHT = 1 Then Do
  332.         MYHEIGHT = BIGTALLEST
  333.     End
  334.     Else Do
  335.         MYHEIGHT = TALLEST.Y
  336.     End
  337.  
  338.     RY1 = Y1 + CELLTOPMARGIN
  339.     RY2 = RY1 + MYHEIGHT
  340.     If SHOWMARGINS = 1 Then Do
  341.         CREATE_LINE X1||UNIT||" "||RY1||UNIT||" "||X2||UNIT||" "||RY1||UNIT
  342.         MARGINLINESGROUPNAME.MARGINLINESGROUPNUM = Result
  343.         MARGINLINESGROUPNUM = MARGINLINESGROUPNUM + 1
  344.         CREATE_LINE X1||UNIT||" "||RY2||UNIT||" "||X2||UNIT||" "||RY2||UNIT
  345.         MARGINLINESGROUPNAME.MARGINLINESGROUPNUM = Result
  346.         MARGINLINESGROUPNUM = MARGINLINESGROUPNUM + 1
  347.     End
  348.     Do X = 0 To CELLSX-1
  349.         OBJECT_DESELECT
  350.         OBJECT_SELECT TEXT.Y.X
  351.         If Right(JUST.Y.X, 1) = "T" Then Do
  352.             OBJECT_SPECS_GET STEM 'OBJSPECS.'
  353.             TY = OBJSPECS.TOP / PTCNV
  354.             HY = OBJSPECS.HEIGHT / PTCNV
  355.  
  356.             If CENTRETALLEST = 1 Then Do
  357.                 TY = TY - (TALLEST.Y - HY)
  358.             End
  359.             If CENTRETALLEST = 2 Then Do
  360.                 TY = TY - (BIGTALLEST - HY)
  361.             End
  362.  
  363.             "OBJECT_MOVE Y "||(RY1-TY)||UNIT
  364.         End
  365.         If Right(JUST.Y.X, 1) = "M" Then Do
  366.             OBJECT_SPECS_GET STEM 'OBJSPECS.'
  367.             TY = OBJSPECS.TOP / PTCNV
  368.             If CENTRETALLEST = 0 Then Do
  369.                 HY = OBJSPECS.HEIGHT / PTCNV
  370.             End
  371.             If CENTRETALLEST = 1 Then Do
  372.                 HY = TALLEST.Y
  373.             End
  374.             If CENTRETALLEST = 2 Then Do
  375.                 HY = BIGTALLEST
  376.             End
  377.  
  378.             "OBJECT_MOVE Y "||((RY1-TY) + ((MYHEIGHT-HY)/2))||UNIT
  379.         End
  380.         If Right(JUST.Y.X, 1) = "B" Then Do
  381.             OBJECT_SPECS_GET STEM 'OBJSPECS.'
  382.             TY = OBJSPECS.TOP / PTCNV
  383.             HY = OBJSPECS.HEIGHT / PTCNV
  384.  
  385.             If CENTRETALLEST = 1 Then Do
  386.                 TY = TY + (TALLEST.Y - HY)
  387.             End
  388.             If CENTRETALLEST = 2 Then Do
  389.                 TY = TY + (BIGTALLEST - HY)
  390.             End
  391.  
  392.             "OBJECT_MOVE Y "||((RY1-TY) + (MYHEIGHT-HY))||UNIT
  393.         End
  394.     End
  395.  
  396.     Y1 = Y1 + CELLTOPMARGIN + CELLBOTTOMMARGIN + MYHEIGHT
  397. End
  398. CREATE_LINE X1||UNIT||" "||Y1||UNIT||" "||X2||UNIT||" "||Y1||UNIT
  399. LINESGROUPNAME.LINESGROUPNUM = Result
  400. LINESGROUPNUM = LINESGROUPNUM + 1
  401.  
  402. /* Finally, we group together all the gridlines so that it will make them */
  403. /* a little easier to colour. If SHOWMARGINS is set, then they too will   */
  404. /* be grouped, but separately. */
  405.  
  406. OBJECT_DESELECT
  407. Do N = 0 To LINESGROUPNUM-1
  408.     OBJECT_SELECT LINESGROUPNAME.N
  409. End
  410. OBJECT_GROUP
  411.  
  412. If SHOWMARGINS = 1 Then Do
  413.     OBJECT_DESELECT
  414.     Do N = 0 To MARGINLINESGROUPNUM-1
  415.         OBJECT_SELECT MARGINLINESGROUPNAME.N
  416.     End
  417.     OBJECT_GROUP
  418. End
  419.  
  420. REDRAW_ON
  421.  
  422. /* END PROGRAM ***************************************************/
  423.  
  424. 'PROJECT_UNLOCK'
  425.  
  426. exit
  427.  
  428. /* On ERROR */
  429.  
  430. ERROR:
  431.  
  432. 'PROJECT_UNLOCK'
  433.  
  434. /* If we get here, either an error occurred with the command's */
  435. /* execution or there was an error with the command itself. */
  436. /* In the former case, rc2 contains the error message and in */
  437. /* the latter, rc2 contains an error number. SIGL contains */
  438. /* the line number of the command which caused the jump */
  439. /* to ERROR: */
  440.  
  441. if datatype(rc2,'NUMERIC') == 1 then do
  442.     /* See if we can describe the error with a string */
  443.  
  444.     select
  445.         when rc2 == 103 then
  446.             err_string = "ERROR 103, "||,
  447.                 "out of memory at line "||SIGL
  448.         when rc2 == 114 then
  449.             err_string = "ERROR 114, "||,
  450.                 "bad command template at line "||SIGL
  451.         when rc2 == 115 then
  452.             err_string = "ERROR 115, "||,
  453.                 "bad number for /N argument at line "||SIGL
  454.         when rc2 == 116 then
  455.             err_string = "ERROR 116, "||,
  456.                 "required argument missing at line "||SIGL
  457.         when rc2 == 117 then
  458.             err_string = "ERROR 117, "||,
  459.                 "value after keywork missing at line "||SIGL
  460.         when rc2 == 118 then
  461.             err_string = "ERROR 118, "||,
  462.                 "wrong number of arguments at line "||SIGL
  463.         when rc2 == 119 then
  464.             err_string = "ERROR 119, "||,
  465.                 "unmatched quotes at line "||SIGL
  466.         when rc2 == 120 then
  467.             err_string = "ERROR 120, "||,
  468.                 "line too long at line "||SIGL
  469.         when rc2 == 236 then
  470.             err_string = "ERROR 236, "||,
  471.                 "unknown command at line "||SIGL
  472.         otherwise
  473.             err_string = "ERROR "||rc2||", at line "||SIGL
  474.         end
  475.     end
  476. else if rc2 == 'RC2' then do
  477.     err_string = "ERROR in command at line "||SIGL
  478.     end
  479. else do
  480.     err_string = rc2||", line "||SIGL
  481.     end
  482.  
  483. req_message TEXT '"'err_string'"'
  484.  
  485. exit
  486.